/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.kiakaku.downloadpage;

import java.util.Iterator;
import java.util.LinkedList;
import org.kiakaku.utility.FileUtility;

/*
 *   File HePhuongTrinh is created by kiakaku on Mar 22, 2012 10:20:22 AM
 * If you want modify this file please insert information in here 
 * - Last modify in Mar 22, 2012, 10:20:22 AM by kiakaku
 *                  
 *
 * @author kiakaku
 */
public class HePhuongTrinh {

    public static final int RANGE_MAU = 1000000;
    public static final double ANPHA = 0.9984202211690363;
    public LinkedList<Integer>[] hePhuongTrinh;
    public double[] range;
    public double anpha = 0;

    public HePhuongTrinh() {
        range = new double[50001];
        range[0] = RANGE_MAU;
        for (int i = 1; i < 50001; i++) {
            range[i] = 1.0;
            range[i] = 1.0;
        }
        // Khởi tạo mảng danh sách liên kết
        hePhuongTrinh = (LinkedList<Integer>[]) new LinkedList[50001];
        for (int i = 0; i < 50001; i++) {
            hePhuongTrinh[i] = new LinkedList<Integer>();
        }
    }

    public void taoHePhuongTrinh() {
//        all = new LinkedList(FileUtility.docListOne(OutLink.ALL_NODE));
        LinkedList<Integer> source = (LinkedList<Integer>) FileUtility.docListInt(OutLink.SOURCE_FILE);
        LinkedList<Integer> target = (LinkedList<Integer>) FileUtility.docListInt(OutLink.TAGET_FILE);
//        LinkedList<Node> all = (LinkedList<Node>) FileUtility.docListOne(OutLink.ALL_NODE);
//        System.out.println(all.size());
//        for(Node a:all){
//            System.out.println(a+" id:"+a.getId());
//        }
//        for (Integer b : source) {
//            if(b>49000){
//                System.out.println(b);
//            }
//        }
//        for (Integer b : target) {
//            if(b>49000){
//                System.out.println(b);
//            }
//        }
        Iterator s = source.iterator();
        Iterator t = target.iterator();
        System.out.println(source.size());
        System.out.println(target.size());
        while (s.hasNext()) {
            Integer sInt = (Integer) s.next();
            Integer tInt = (Integer) t.next();
            hePhuongTrinh[sInt].add(tInt);
            hePhuongTrinh[tInt].add(sInt);
        }
//        int max = 0;
//        int mark = 0;
//        for (int i = 0; i < 50001; i++) {
//            if (max < hePhuongTrinh[i].size()) {
//                max = hePhuongTrinh[i].size();
//                mark = i;
//            }
//        }
//        System.out.println("max:" + max);
//        System.out.println("Hàng thứ : " + mark);
//        System.out.println(hePhuongTrinh[mark]);
    }
    /*
     * Sử dụng đánh giá sai số của phương pháp lặp đơn và ta có ||anpha|| = 2
     * Chú ý là : Tổng trị tuyệt đối các hệ số theo hàng của ma trận hệ số hệ phương 
     * trình luôn = 2
     */

    public void giaiHePhuongTrinh() {
        double saiSo = 1.0;
        double x1x0 = 0;
        int buocLap = 0;
        for (int i = 1; i < 50001; i++) {
            range[i] = 0.0;
            for (Integer a : hePhuongTrinh[i]) {
                range[i] += range[a];
            }
            range[i] = range[i] / (hePhuongTrinh[i].size() + 1); // +1 là do còn node đất có giá trị range = 0
        }
        for (int i = 1; i < 50001; i++) {
            if (x1x0 < Math.abs(range[i] - 1)) {
                x1x0 = Math.abs(range[i] - 1);
            }
        }
        System.out.println("x1x0:" + x1x0);
        while (saiSo > 0.0001) {
            buocLap++;
            System.out.println("Lặp lần:" + buocLap);
            for (int i = 1; i < 50001; i++) {
                range[i] = 0.0;
                for (Integer a : hePhuongTrinh[i]) {
                    range[i] += range[a];
                }
                range[i] = range[i] / (hePhuongTrinh[i].size() + 1); // +1 là do còn node đất có giá trị range = 0
            }
            saiSo = (633 * Math.pow(ANPHA, buocLap)) * x1x0;
            System.out.println("sai số:" + saiSo);
        }
        double maxRange = 0.0;
        int pos = 0;
        for (int i = 1; i < range.length; i++) {
            if (maxRange < range[i]) {
                maxRange = range[i];
                pos = i;
            }
        }
        System.out.println("Lớn nhất vị trí: " + pos);
//        System.out.println(all.get(5));
//        System.out.println(all.get(6));
    }

    public void getMaxRangeURL() {
        int vitri = 9;
        LinkedList<Node> all = new LinkedList<Node>(FileUtility.docListOne(OutLink.ALL_NODE));
        System.out.println("id: " + all.get(vitri - 1).getId());
        System.out.println("dept: " + all.get(vitri - 1).getDepth());
        System.out.println("url: " + all.get(vitri - 1).getUrl());
        System.out.println("id: " + all.get(vitri).getId());
        System.out.println("dept: " + all.get(vitri).getDepth());
        System.out.println("url: " + all.get(vitri).getUrl());

        System.out.println("id: " + all.get(vitri + 1).getId());
        System.out.println("dept: " + all.get(vitri + 1).getDepth());
        System.out.println("url: " + all.get(vitri + 1).getUrl());

    }

    public static void main(String[] args) {
        HePhuongTrinh a = new HePhuongTrinh();
        a.getMaxRangeURL();
//        a.taoHePhuongTrinh();
//        a.giaiHePhuongTrinh();
    }
}
